1   /*
2    * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  
24  /*
25   * @test
26   * @bug 6322301
27   * @summary Verify when missing annotation classes cause exceptions
28   * @author Joseph D. Darcy
29   * @compile MissingTest.java A.java B.java C.java D.java Marker.java Missing.java MissingWrapper.java
30   * @clean Missing
31   * @run main MissingTest
32   */
33  
34  import java.lang.reflect.*;
35  
36  /**
37   * This test verifies that a missing annotation class leads to the
38   * expected exceptional behavior; a missing directly applied
39   * annotation is currently ignored but a missing annotation value
40   * inside another annotation throws an exception.
41   *
42   * To be run as intended, the annotation type Missing should *not* be
43   * on the classpath when the test is run; with jtreg, it is deleted by
44   * the @clean directive.
45   */
46  public class MissingTest {
47      /**
48       * For the annotated element argument, get all its annotations and
49       * see whether or not an exception is throw upon reading the
50       * annotations.  Additionally, verify at least one annotation is
51       * present.
52       */
53      private static void testAnnotation(AnnotatedElement element,
54                                  boolean exceptionExpected) {
55          java.lang.annotation.Annotation[] annotations;
56          try {
57              annotations = element.getAnnotations();
58              if (exceptionExpected) {
59                  System.err.println("Error: Did not get an exception reading annotations on "
60                                     + element);
61                  System.err.println("Annotations found: "
62                                     + java.util.Arrays.toString(annotations));
63                  throw new RuntimeException();
64              }
65              if (annotations.length == 0) {
66                  System.err.println("Error: no annotations found on " + element);
67                  throw new RuntimeException();
68              }
69          } catch (Throwable t) {
70              if (!exceptionExpected) {
71                  System.err.println("Error: Got an unexpected exception reading annotations on "
72                                     + element);
73                  throw new RuntimeException(t);
74              }
75          }
76      }
77  
78      /**
79       * For the annotated element argument, get all its annotations and
80       * see whether or not an exception is throw upon reading the
81       * annotations.  Additionally, verify at least one annotation is
82       * present.
83       */
84      private static void testParameterAnnotation(Method m,
85                                                  boolean exceptionExpected) {
86          java.lang.annotation.Annotation[][] annotationsArray;
87          try {
88              annotationsArray = m.getParameterAnnotations();
89              if (exceptionExpected) {
90                  System.err.println("Error: Did not get an exception reading annotations on method"
91                                     + m);
92                  System.err.println("Annotations found: "
93                                     + java.util.Arrays.toString(annotationsArray));
94                  throw new RuntimeException();
95              }
96              if (annotationsArray.length == 0 ) {
97                  System.err.println("Error: no parameters for " + m);
98                  throw new RuntimeException();
99              } else {
100                 java.lang.annotation.Annotation[] annotations = annotationsArray[0];
101                 if (annotations.length == 0) {
102                     System.err.println("Error: no annotations on " + m);
103                     throw new RuntimeException();
104                 }
105             }
106         } catch (Throwable t) {
107             if (!exceptionExpected) {
108                 System.err.println("Error: Got an unexpected exception reading annotations on "
109                                    + m);
110                 throw new RuntimeException(t);
111             }
112         }
113     }
114 
115     public static void main(String argv[]) throws Exception {
116         // Class A has a directly applied annotation whose class is
117         // missing.
118         testAnnotation(A.class, false);
119 
120         // Class B has a directly applied annotation whose value
121         // includes to an annotation class that is missing.
122         testAnnotation(B.class, true);
123 
124 
125         // Class C has a directly applied parameter annotation whose
126         // class is missing.
127         testParameterAnnotation(C.class.getDeclaredMethod("method1", Object.class),
128                                 false);
129 
130         // Class D has a directly applied parameter annotation whose value
131         // includes to an annotation class that is missing.
132         testParameterAnnotation(D.class.getDeclaredMethod("method1", Object.class),
133                                 true);
134     }
135 }